/*
 * 版权所有 (C) 2021 中国南方航空股份有限公司。
 * 本文件可能包含有南方航空公司的机密或专有信息。
 * 未经许可不得擅自公开、复制这些机密资料及其中任何部分，
 * 只可按照其使用许可协议，在南方航空公司内部使用。
 *
 * File Name: $(#)ForkJoinDemo.java
 * Creation Date: 2021年11月30日 上午11:07:23
 * $Id$
 */
package com.andy.note.main.concurrent.forkjoin;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveAction;

/**
 * 切分任务独立完成不需要聚合
 * 
 * @author zhouguoan 908119428@qq.com
 * @version $Revision: 1.1 $ $Date: 2021年11月30日 上午11:07:23 $
 */
public class ForkJoinActionDemo extends RecursiveAction {

    private static final long serialVersionUID = -4443370239691730623L;
    
    private long workLoad = 0;

    public ForkJoinActionDemo(long workLoad) {
        this.workLoad = workLoad;
    }

    @Override
    protected void compute() {
        if (workLoad > 8) {
            System.out.println("Splitting workLoad : " + this.workLoad);
            List<ForkJoinActionDemo> subtasks = new ArrayList<ForkJoinActionDemo>();
            subtasks.addAll(createSubtasks());

            for (RecursiveAction subtask : subtasks) {
                subtask.fork();
            }
            
        } else {
            System.out.println("Doing workLoad myself: " + this.workLoad);
        }
    }

    private List<ForkJoinActionDemo> createSubtasks() {
        List<ForkJoinActionDemo> subtasks = new ArrayList<ForkJoinActionDemo>();

        ForkJoinActionDemo subtask1 = new ForkJoinActionDemo(this.workLoad / 2);
        ForkJoinActionDemo subtask2 = new ForkJoinActionDemo(this.workLoad / 2);

        subtasks.add(subtask1);
        subtasks.add(subtask2);

        return subtasks;
    }
    
    public static void main(String[] args) {
        ForkJoinActionDemo demo = new ForkJoinActionDemo(16);
        ForkJoinPool pool = new ForkJoinPool();
        pool.invoke(demo);
        pool.shutdown();
    }
}
